/***************************************************************
 *	dgram.c
 *	support functions for datagram based programs
 */ 
 
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<string.h>
 
#define   HOSTLEN  256
 
int make_internet_address();
 
int make_dgram_server_socket(int portnum)
{
	struct  sockaddr_in   saddr;   /* build our address here */
	char	hostname[HOSTLEN];     /* address 	         */
	int	sock_id;	       /* the socket             */
 
	sock_id = socket(PF_INET, SOCK_DGRAM, 0);  /* get a socket */
	if ( sock_id == -1 ) return -1;
 
	/** build address and bind it to socket **/
 
	gethostname(hostname, HOSTLEN);         /* where am I ?         */
	make_internet_address(hostname, portnum, &saddr);
 
	if ( bind(sock_id, (struct sockaddr *)&saddr, sizeof(saddr)) != 0 )
	       return -1;
 
	return sock_id;
}
int make_dgram_client_socket()
{
	return socket(PF_INET, SOCK_DGRAM, 0);
}
 
int make_internet_address(char *hostname, int port, struct sockaddr_in *addrp)
/*
 * constructor for an Internet socket address, uses hostname and port
 *   (host,port) -> *addrp
 */
{
	struct hostent	*hp;
 
	bzero((void *)addrp, sizeof(struct sockaddr_in));
	hp = gethostbyname(hostname);
	if ( hp == NULL ) return -1;
	bcopy((void *)hp->h_addr, (void *)&addrp->sin_addr, hp->h_length);
	addrp->sin_port = htons(port);
	addrp->sin_family = AF_INET;
	return 0;
}
 
int get_internet_address(char *host, int len, int *portp, struct sockaddr_in *addrp)
/*
 * extracts host and port from an internet socket address
 *   *addrp -> (host,port)
 */
{
	strncpy(host, inet_ntoa(addrp->sin_addr), len );
	*portp = ntohs(addrp->sin_port);
	return 0;
}